Kotlin 1.6
一言で表すと
Language
when文でenumやselaedやbooleanにおいて全てのケースをカバーしていない場合warningが出る
1.7からは全てのケースがカバーされていない場合エラーになる
code:kotlin
sealed class Contact {
data class PhoneCall(val number: String) : Contact()
data class TextMessage(val number: String) : Contact()
}
fun Contact.messageCost(): Int =
when(this) {
is Contact.PhoneCall -> 42
}
fun sendMessage(contact: Contact, message: String) {
when(message.isEmpty()) {
true -> return
}
when(contact) {
is Contact.PhoneCall -> TODO()
}
}
Go.icon 🎉
horis.icon よさそう
suspend関数型を使用できるようになった.
suspend functionを別のクラスに目的の動作を含めることで合理化できるようになった
suspend functionのクラスのインスタンスを使用できるlaunchOnClick(MyClickAction())
code:kotlin
class MyClickAction : suspend () -> Unit {
override suspend fun invoke() { TODO() }
}
fun launchOnClick(action: suspend () -> Unit) {}
Mori Atsushi.icon UseCaseみたいなメソッドを1個のクラスだと便利なのかな?わかりにくい気も?
通常の関数からsuspend fuctionへの変換が導入された
code:kotlin
fun getSuspending(suspending: suspend () -> Unit) {}
fun suspending() {}
fun test(regular: () -> Unit) {
getSuspending { } // OK
getSuspending(::suspending) // OK
getSuspending(regular) // OK
}
Mori Atsushi.icon これ意外とやりたかった
アノテーションクラスのインスタンス化がstableになった
再起的なジェネリクス型の型推論が改善された
対応するパラメータの上限のみに基づいて型引数を推論できるようになった
ビルダー推論の変更
TypeParameterのアノテーションのサポート
code:kotlin
@Target(AnnotationTarget.TYPE_PARAMETER)
annotation class BoxContent
class Box<@BoxContent T> {}
TypeParameterのアノテーションはJVMバイトコードに出力されるためアノテーションプロセッサが扱える
horis.icon Box<@BoxContent T> この書き方初めてみた...
Mori Atsushi.icon 今までは出来なかったという話っぽい?
Supporting previous API versions for a longer period
3つ前のAPIバージョンまでをサポートするようになった.現在では1.3,1.4,1.5,1.6をサポートしている
Mori Atsushi.icon ということは今回は何も消えてないということですね!
Kotlin/JVM
Kotlin/JS
引き続きコンパイラのIRバックエンドの安定化に取り組んでいる
Node.jsとYarnのダウンロードを無効化するオプションの追加
code:kotlin
rootProject.plugins.withType<YarnPlugin::class.java> {
rootProject.the<YarnRootExtension>().download = false // or true for default behavior
}
rootProject.plugins.withType<NodeJsRootPlugin::class.java> {
rootProject.the<NodeJsRootExtension>().download = false // or true for default behavior
}
Kotlin Gradle plugin
Compiler Pluginの実装に使われていた KotlinGradleSubplugin の非推奨レベルをERRORに
KotlinCompilerPluginSupportPlugin を使うようにする
horis.icon 命名ややこしいw
ビルドオプションの kotlin.useFallbackCompilerSearch 、コンパイラオプションの noReflect と includeRuntime を削除
コンパイラオプションの useIR が非表示となり、今後削除される予定。
mayamito.icon デフォになるのかな?
Mori Atsushi.icon Kotlin/JSは別の方法でIRを利用できる
Standard Library
New readline functions
従来では readLine() でnullableなStringを返すreadline関数があり、non-nullとして使いたい場合には !! を使うかエルビス演算子を使うしかなかったが、今回non-nullなStringを返す readln() と nullableなStringを返す readlnOrNull() が追加された。
readLine() も残るが、IDEなどが readln() で置き換えるようレコメンドする。
Stable typeOf()
typeOf<T>() がstableに
もともとはJVMでしか動かなかったが、どのプラットフォームでもこの関数で KType を取得できる
Stable collection builders
buildMap() buildList() buildSet() が @OptIn なしで使えるように(stableに)
code:kotlin
val x = listOf('b', 'c')
val y = buildList {
add('a')
addAll(x)
add('d')
}
Go.icon ちょっと嬉しい
Stable Duration API
時間間隔を表すためのDurationクラスがStableに昇格
code:kotlin
val duration = 10000
println("There are ${duration.seconds.inWholeMinutes} minutes in $duration seconds")
Go.icon 時間系のライブラリがいっぱいあるけど、Durationは流行るかな
Mori Atsushi.icon 自作してたのをそろそろ直したい
Splitting Regex into a sequence
Regex.splitToSequence(CharSequence) と CharSequence.splitToSequence(Regex) がstableに
code:kotlin
"hoge fuga piyo".split(" ".toRegex())
Mori Atsushi.icon 拡張関数の親と引数の組み合わせで全く同じのがあるのどうなんだろう?
Bit rotation operations on integers
bit操作の関数ができたよー
右or左に指定したbitだけ回転させる(回転ってなんだ :eyes: )
code:kotlin
val number: Short = 0b10001
println(number
.rotateRight(2)
.toString(radix = 2)) // 100000000000100
println(number
.rotateLeft(2)
.toString(radix = 2)) // 1000100
Changes for replace() and replaceFirst() in JS
Regexの replace() や replaceFirst() のJS版実装の変更
1.6より前では、置換文字列にgroup referenceが含まれるためJSとJavaで実装が違うかったが、プラットフォーム間の差異をなくすためにJSの実装を変えたらしい
${name} $index がグループ参照
Improvements to the existing API
Comparable.compareTo() がinfixで使えるようになった
code:kotlin
class WrappedText(val text: String) : Comparable<WrappedText> {
override fun compareTo(other: WrappedText): Int =
this.text compareTo other.text
}
Mori Atsushi.icon infixの便利さがわかっていない…
JSの Regex.replace() は全てのプラットフォームで実装を統一するためにinlineにはしていない
compareTo() equals() isBlank() がJVMと同じ結果になるようJS側が改善された。
これまではASCIIではない文字列に関して不具合があったらしい
Go.icon data classもJVMと同じ感覚で使えてるのか不安になってきた...でもここのequalsとかは文字列の話
Deprecations
In Kotlin 1.6.0, we're starting the deprecation cycle with a warning for some JS-only stdlib API.
JSのみのstdlib APIでdeprecationになったものがある?
文字列の結合には concat() の代わりに plus() を使おう
正規表現のマッチには String.matches(regex: String) ではなく Regex.matches() を使おう
同じく String.match(regex: String) ではなく Regex.findAll() とか
Array<out T>.sort() がdeprecationになった
Kotlin/Native
(プレビュー)新しいメモリマネージャー
Xcode13のサポート
あらゆるホスト上でのWindowsターゲットのコンパイル
LLVMとlinkerのアップデート
パフォーマンス向上
JVMとJSのIR backendsの統合されたコンパイラプラグインABI
klibのリンクに失敗した場合の詳細なエラーメッセージ
ハンドリングされていない例外処理のAPIを再構築
(プレビュー)新しいメモリマネージャー
JVMとNativeでプラットフォームの違いをなくすことに近づいている
変更点の一つが、Kotlin/JVMのように、トップレベルのプロパティを遅延初期化する。
トップレベルのプロパティは、同じファイルのトップレベルのプロパティや関数に初めてアクセスした時に初期化される。
Go.icon 別の記事で紹介されているマルチスレッドの話が気になる Xcode13のサポート
Xcode13で追加された新しいライブラリはKotlin1.6.0では使えないが、今後のバージョンでサポートが追加されていく予定
あらゆるホスト上でのWindowsターゲットのコンパイル
1.6.0から、WindowsターゲットのmingwX64とmingwX86をコンパイルするのに、Windowsホストは必要ありません。これらは、Kotlin/Nativeをサポートするすべてのホストでコンパイルできます。
概要
気になるポイント
コメント